﻿using System;
using Kaesoft.Hospedaje.Common;
using Kaesoft.Hospedaje.Proxy;
using System.Windows;
using System.Windows.Browser;

namespace Kaesoft.Hospedaje.Shell
{
    public class MainPageViewModel : ViewModelBase
    {
        #region Variables
        private bool _loginVisible = false;
        private bool _marcoTrabajoVisible = false;
        private LoginViewModel _loginViewModel;
        #endregion

        #region Propiedades
        public MarcoTrabajoViewModel MarcoTrabajoViewModel { get; set; }

        /// <summary>
        /// Pantalla de login visible
        /// </summary>
        public bool LoginVisible
        {
            get { return _loginVisible; }
            set
            {
                if (_loginVisible != value)
                {
                    _loginVisible = value;
                    OnPropertyChanged("LoginVisible");
                }
            }
        }

        /// <summary>
        /// Marco de trabajo visible
        /// </summary>
        public bool MarcoTrabajoVisible
        {
            get { return _marcoTrabajoVisible; }
            set
            {
                if (_marcoTrabajoVisible != value)
                {
                    _marcoTrabajoVisible = value;
                    OnPropertyChanged("MarcoTrabajoVisible");
                }
            }
        }

        /// <summary>
        /// ViewModel para la pantalla de login
        /// </summary>
        public LoginViewModel LoginViewModel
        {
            get { return _loginViewModel; }
            set
            {
                if (_loginViewModel != value)
                {
                    _loginViewModel = value;
                    OnPropertyChanged("LoginViewModel");
                }
            }
        }
        #endregion

        #region Eventos
        #endregion

        #region Constructor
        /// <summary>
        /// Crea una instancia de MainPageViewModel
        /// </summary>
        public MainPageViewModel()
        {
            MessageBoxWindow = new MessageWindowView();

            WcfProxyInvoker.ErrorNegocio += new EventHandler(WcfProxyInvoker_ErrorNegocio);
            WcfProxyInvoker.ErrorConexion += new EventHandler<ErrorConexionEventArgs>(WcfProxyInvoker_ErrorConexion);
            WcfProxyInvoker.SesionExpirada += new EventHandler(WcfProxyInvoker_SesionExpirada);

            LoginVisible = true;
            MarcoTrabajoVisible = false;

            LoginViewModel = new LoginViewModel();
            LoginViewModel.UsuarioAutenticado += (s, ev) =>
            {
                Procesando = false;

                if (Caching.Instancia.UsuarioSistema != null)
                {
                    LoginVisible = false;
                    MarcoTrabajoViewModel = new MarcoTrabajoViewModel();
                    OnPropertyChanged("MarcoTrabajoViewModel");
                    MarcoTrabajoVisible = true;
                }
            };
        }

        #endregion

        #region Metodos Publicos
        #endregion

        #region Metodos Privados
        /// <summary>
        /// Callback ejecutado cuando ha existido un error en la conexión
        /// </summary>
        /// <param name="sender">Proxy</param>
        /// <param name="e">Tipo de error</param>
        void WcfProxyInvoker_ErrorConexion(object sender, ErrorConexionEventArgs e)
        {
            MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel("Error de Conexión",
                                                                                   MessageBoxButtons.Ok, MessageBoxIcon.Warning);
            MessageBoxWindow.DataContext = msgWindowViewModel;
            msgWindowViewModel.Closing += (msgsender, ev) =>
            {
                MessageBoxWindow.Close();
                this.MarcoTrabajoViewModel.WorkspaceActual.Procesando = false;
                if (ev.Data == MessageBoxResult.OK) return;
                throw e.InnerException;
            };
            MessageBoxWindow.ShowDialog();
        }

        /// <summary>
        /// Callback ejecutado cuando se ha producido una excepción de negocio
        /// </summary>
        /// <param name="sender">Proxy</param>
        /// <param name="e">Evento</param>
        void WcfProxyInvoker_ErrorNegocio(object sender, EventArgs e)
        {
            MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel("Error de Negocio",
                                                                                   MessageBoxButtons.Ok, MessageBoxIcon.Error);
            MessageBoxWindow.DataContext = msgWindowViewModel;
            msgWindowViewModel.Closing += (msgsender, ev) =>
            {
                MessageBoxWindow.Close();
                if (this.MarcoTrabajoViewModel != null)
                    this.MarcoTrabajoViewModel.WorkspaceActual.Procesando = false;

                if (ev.Data != MessageBoxResult.OK) return;
            };
            MessageBoxWindow.ShowDialog();
        }

        void WcfProxyInvoker_SesionExpirada(object sender, EventArgs e)
        {
            MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel("La sesión a caducado. Vuelva a ingresar a la aplicación",
                                                                                   MessageBoxButtons.Ok, MessageBoxIcon.Warning);
            MessageBoxWindow.DataContext = msgWindowViewModel;
            msgWindowViewModel.Closing += (msgsender, ev) =>
            {
                MessageBoxWindow.Close();
                if (this.MarcoTrabajoViewModel != null)
                    this.MarcoTrabajoViewModel.WorkspaceActual.Procesando = false;
                if (ev.Data != MessageBoxResult.OK) return;
            };
            MessageBoxWindow.ShowDialog();
        }
        #endregion
    }
}